.TITLE EVENT .IDENT /X01.01/ ; ; Copyright (c) 1995-1999 by Mentec, Inc., U.S.A. ; All rights reserved ; ; THIS SOFTWARE IS FURNISHED UNDER A LICENSE AND MAY ONLY BE USED ; OR COPIED IN ACCORDANCE WITH THE TERMS OF SUCH LICENSE. ; ; VERSION X01.01 ; ; K. E. KINNEAR 2-JUN-78 ; ; EVENT TRACE SUBROUTINES ; ; MODIFIED BY: ; ; B. S. MCCARTHY 13-AUG-80 ; ; BM085 -- TURN ON/ENHANCE EVENT LOGGING ; ; ; MACRO LIBRARY CALLS ; .MCALL HWDDF$ HWDDF$ ;DEFINE HARDWARE REGISTERS ;+ ; **-$EVADD-ADD EVENT TO THE EVENT BUFFER ; ; THIS ROUTINE WILL CHECK THE LENGTH OF THE EVENT AGAINST ; THE SPACE REMAINING IN THE BUFFER, AND SWITCH TO ANOTHER ; BUFFER IF NECESSARY. IF SPACE REMAINS, IT WILL PLACE THE ; EVENT HEADER INTO THE BUFFER AND LEAVE THE REGISTERS SET UP ; FOR THE ADDITION OF THE EVENT SPECIFIC PARAMETERS. ; ; AN INVOCATION OF THE EVENT MACRO WILL CALL THIS ROUTINE IF ; THE EVENT TRACE IS ENABLED FOR THAT EVENT. THIS ROUTINE WILL ; CALL $SETF IF THE BUFFER IS FULL TO SET LOCAL EVENT FLAG 1 FOR ; THE PRIV. BUFFER DUMPPING TASK. IF THE BUFFER DUMP TASK IS ; WAITING FOR EVENT FLAG THEN ALL WILL BE WELL, BUT IF IT IS ; STOPPED FOR EVENT FLAG, POSSBILE PROBLEMS WILL RESULT SINCE ; $SETF WILL CALL $EXQRN/$NXTSK INSTEAD OF JUST $SETCR. IN ANY ; CASE, THE MACRO CANNOT BE INVOKED IN ANY AREA WHERE A $SETF/$SETCR ; WOULD CAUSE ANY PROBLEMS. ; ; BUFFER FORMAT: ; ; THE FIRST WORD OF EACH BUFFER IS THE LENGTH OF THE BUFFER ; IN BYTES. IT IS NEVER CHANGED ONCE THE BUFFER IS INITIALIZED. ; A ZERO WORD WHERE AN EVENT IS EXPECTED OR BUFFER FULL ENDS THE ; BUFFER. A NON-ZERO SECOND WORD SHOWS AN ACTIVE BUFFER. ; THE SECOND WORD OF THE BUFFER IS A BUFFER SEQUENCE NUMBER, WHICH ; GOES UP FOR EACH BUFFER. THIS IS USED BY THE BUFFER DUMP TASK ; TO PROPERLY DUMP THE BUFFERS TO THE FILE. ; THE SECOND WORD MAY ONLY BE CHANGED AT SYSTEM STATE. ; ; A BUFFER LIST CONTAINING TWO WORD ENTRIES EXISTS WHICH THIS ; ROUTINE WILL SEARCH TO FIND A FREE BUFFER WHENEVER ONE OVERFLOWS. ; THE FIRST WORD OF EACH ENTRY IS THE KISAR6 MAPPING TO THE ; FIRST WORD OF THE BUFFER AND THE SECOND IS THE LENGTH OF THE ; BUFFER IN BYTES. ; ; THE EVENT HEADER FORMAT FOR EACH EVENT IS AS FOLLOWS: ; ; +-----------------------------------------------+ ; ! CPU NUMBER ! EVENT NUMBER ! ; +-----------------------------------------------+ ; ! SECOND OF MINUTE ! TICK OF SECOND ! ; +-----------------------------------------------+ ; ! EVENT SEQUENCE NUMBER ! ; +-----------------------------------------------+ ; ! PARAMETERS ! ; +-----------------------------------------------+ ; ! . ! ; +-----------------------------------------------+ ; ! . ! ; +-----------------------------------------------+ ; ! . ! ; +-----------------------------------------------+ ; ; ; WHEN THE MACRO RECIEVES CONTROL FROM THIS SUBROUTINE, IF THE CARRY ; IS CLEAR THEN R0 POINTS TO THE PLACE TO INSERT THE FIRST OF THE ; PARAMETERS. KISAR6 IS SET UP CORRECTLY FOR THIS TOO. ; ; INPUTS: ; ; R0=EVENT NUMBER. ; ; OUTPUTS: ; ; IF CC: ; R0=DISPLACEMENT INTO BUFFER FOR PARAMETERS. ; 2(SP)=SAVED KISAR6 VALUE. ; KISAR6=SET UP FOR BUFFER. ; ; IF CS: ; R0=UNDEFINED. ; ; REGISTERS MODIFIED: ; ; NONE. ;- .IF DF E$$VNT $EVADD::MOV KISAR6,-(SP) ;SAVE THE KISAR6 OFFSET MOV $EVKS6,KISAR6 ;MAP TO CURRENT BUFFER ; ; CHECK FOR ENOUGH ROOM IN THE BUFFER FOR THIS EVENT ; MOV R0,-(SP) ;SAVE THE EVENT NUMBER CLR -(SP) ;FOR MOVB -(SP) INSTRUCTION MOVB $EVTAB(R0),(SP) ;GET THE LENGTH OF THE EVENT MOV $EVDIS,R0 ;GET CURRENT BUFFER POSITION ADD (SP)+,$EVDIS ;ADD EVENT LENGTH TO POSITION CMP $EVLEN,$EVDIS ;COMPARE CURRENT POS WITH LENGTH + 140000 BHI 20$ ;IF HI NO BEQ 5$ ;IF EQ BUFFER EXACTLY FULL ; ; SHOW THIS BUFFER FULL BUT NOT EXACTLY ; CLR (R0) ;PLACE ZERO WORD AT LOGICAL EOB ; ; SWITCH BUFFERS -- CURRENT ONE HAS OVERFLOWED ; 5$: MOV #$EVLST,R0 ;SEARCH FOR FREE BUFFER 10$: MOV (R0)+,KISAR6 ;GET NEXT BUFFER KISAR6 OFFSET BEQ 30$ ;IF EQ NO NEXT OFFSET -- OOPS TST @#140002 ;IS THIS BUFFER FULL? BNE 10$ ;IF NE YES ; ; FOUND EMPTY BUFFER -- CLAIM IT ; MOV KISAR6,$EVKS6 ;SAVE MAPPING TO BUFFER SELECTED 15$: INC $EVBSQ ;BUMP BUFFER SEQUENCE NUMBER BEQ 15$ ;SEQUENCE NUMBER NEVER = 0 MOV $EVBSQ,@#140002 ;PUT SEQUENCE NUMBER IN SECOND BUFFER POSITION ; ; ACTIVATE BUFFER DUMP TASK ; MOV #1,R0 ;SET UP FOR EVENT FLAG SET MOV R1,-(SP) ;SAVE R1 MOV R2,-(SP) ;SAVE R2 MOV R3,-(SP) ;SAVE R3 MOV R4,-(SP) ;SAVE R4 MOV R5,-(SP) ;SAVE R5 MOV $EVTCB,R5 ;SET UP FOR $SETF CALL $SETF MOV (SP)+,R5 MOV (SP)+,R4 MOV (SP)+,R3 MOV (SP)+,R2 MOV (SP)+,R1 ; ; SET UP LATEST BUFFER ; MOV @#140000,$EVLEN ;GET BUFFER LENGTH ADD #140000,$EVLEN ;MAKE LENGTH INTO END OF BUFFER PTR MOV (SP),R0 ;GET EVENT NUMBER MOV $EVTAB(R0),$EVDIS ;SHOW EVENT IN BUFFER MOV #140004,R0 ;INITIAL POSITION IN BUFFER ADD R0,$EVDIS ;MAKE EVDIS REFLECT POSITION AFTER THIS EVENT ; ; PUT INFORMATION IN BUFFER ; 20$: MOVB (SP)+,(R0)+ ;PUT EVENT NUMBER INTO BUFFER .IF DF M$$PRO MOVB $PROCN,(R0)+ ;PUT PROCESSOR NUMBER IN BUFFER .IFF CLRB (R0)+ ;NO PROCESSOR NUMBER ON SINGLE CPU SYS .ENDC INC $EVSEQ ;BUMP EVENT SEQUENCE NUMBER BY ONE MOV $EVSEQ,(R0)+ ;PLACE SEQUENCE NUMBER IN BUFFER MOVB $TTNS,(R0)+ ;PLACE TICK OF SECOND IN BUFFER MOVB $TTNS-2,(R0)+ ;PLACE SECOND OF MINUTE IN BUFFER CLC RETURN ; ; ERROR EXIT ; 30$: TST (SP)+ ;CLEAN STACK INC $EVLOS ;INDICATE EVENT LOST SEC RETURN .ENDC .END